package prtpv;
import java.util.ArrayList;
import java.util.List;

public class Ticket {

    String codigo;
    List<LineaTicket> lineas = new ArrayList<LineaTicket>();
    VentaProxy venta;
    Float resultadoParcial = 0F;
    Float descAcumulado = 0F;
    List<Observador_pvp> observante;
    boolean cancelado;

    public Ticket(VentaProxy ventaEx) {
        venta = ventaEx;
        observante = new ArrayList<Observador_pvp>();
        observante.add(new Display());
        cancelado = false;
    }

    public boolean generarTicket() {

        LinVenta lin;
        LineaTicket lint;
        Producto prod;


        while ((lin = venta.pasaLinVenta()) != null && cancelado == false) {
            if (lin.getClass() == LinCancelar.class) {
                cancelarTicket();
                cancelado = true;
            } else if (lin.getClass() == LinDeshacer.class) {
                
                if (!lineas.isEmpty()) {
                    deshacerLinea(lineas.get(lineas.size() - 1));
                }
            } else if ((prod = Catalogo.instancia().getProducto(((LinProducto) lin).getCod())) != null) {
                if (lineas == null) {
                    lineas = new ArrayList<LineaTicket>();
                }
                lint = new LineaTicket(prod, (LinProducto) lin);
               if (lint.esValida())        // Su precio es > 0
                {
                   
                    lineas.add(lint);
                    resultadoParcial += lint.precioLineaConDesc;
                    descAcumulado += lint.descuento;
                    //Para el observer
                    //publicarCambio(lint, resultadoParcial);
                }
            }

        }
        return cancelado;
    }

    public void publicarCambio(LineaTicket lint, float resultadoParcial) {
        for (Observador_pvp o : observante) {
            System.out.println(o.imprimirLinea(lint, resultadoParcial));
        }
    }

    public void deshacerLinea(LineaTicket lin) {
        resultadoParcial -= lin.precioLineaConDesc;
        descAcumulado -= lin.porcentajeDesc;
        //ArrayList aux=new ArrayList();
        lineas.remove(lineas.size() - 1);
        /*
        for (int i=0;i<lineas.size()-1;i++)
        {
            aux.add(lineas.get(i));
        }
        lineas = aux;
         *
         */
    }

    public boolean esVacio() {
        return lineas.isEmpty();
    }

    public Float obtenResultadoParcial() {
        return resultadoParcial;
    }

    public Float obtenDescAcumulado() {
        return descAcumulado;
    }

    public void cancelarTicket() {
        lineas.clear();
    }
}
